package com.hgkj.common.log.aspectj;

import com.hgkj.common.log.annotation.TimeCount;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;

/**
 * 基于自定义注解的时间统计切面
 */
@Aspect
@Component
@Slf4j
public class TimeCountAspect {

    /**
     * 切入点：拦截所有被@TimeCount注解标记的方法
     */
    @Pointcut("@annotation(com.hgkj.common.log.annotation.TimeCount)")
    public void timeCountPointcut() {
    }

    /**
     * 环绕通知：统计方法执行时间
     */
    @Around("timeCountPointcut()")
    public Object aroundTimeCount(ProceedingJoinPoint joinPoint) throws Throwable {
        long startTime = System.currentTimeMillis();

        // 执行目标方法
        Object result = joinPoint.proceed();

        long endTime = System.currentTimeMillis();
        long costTime = endTime - startTime;

        Signature signature = joinPoint.getSignature();
        MethodSignature methodSignature = (MethodSignature) signature;
        Method method = methodSignature.getMethod();
        TimeCount timeCount = method.getAnnotation(TimeCount.class);

        // 构建日志信息（包含类名、方法名、描述、耗时）
        String className = signature.getDeclaringTypeName();
        String methodName = signature.getName();
        String description = timeCount.description().isEmpty()
                ? "无描述"
                : timeCount.description();

        log.info("[时间统计] 类：{}，方法：{}，描述：{}，执行耗时：{}毫秒",
                className, methodName, description, costTime);
        // 根据注解阈值判断是否打印日志

        // 若耗时超过阈值，可额外打印警告日志（根据需求调整）
        if (costTime > timeCount.threshold() && timeCount.threshold() > 0) {
            log.warn("[时间警告] 类：{}，方法：{} 执行耗时过长（超过{}毫秒），实际耗时：{}毫秒",
                    className, methodName, timeCount.threshold(), costTime);
        }

        return result;
    }
}